package com.yb.custom.annotation.log.util;

import com.yb.custom.annotation.log.exception.CustomException;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.Optional;
import java.util.Set;


/**
 * 当前登录用户信息获取工具类
 *
 * @author yangbiao
 * @date 2022/2/25
 */
public class LoginUserUtils {
    private static InheritableThreadLocal<LoginUser> userInfo = new InheritableThreadLocal<>();

    /**
     * 设置用户信息
     **/
    public static void setUser(LoginUser user) {
        userInfo.set(user);
    }

    /**
     * 获取用户信息
     *
     * @return 用户信息
     **/
    public static Optional<LoginUser> getUser() {
        return Optional.ofNullable(userInfo.get());
    }

    /**
     * 获取用户信息
     *
     * @return 用户信息
     **/
    public static LoginUser getLoginUser() {
        return Optional.ofNullable(userInfo.get())
                .orElseThrow(() -> new CustomException("无效的用户登录信息"));
    }

    /**
     * 获取用户ID
     *
     * @return 用户ID
     **/
    public static String getUserId() {
        return getUser().map(LoginUser::getUserId)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取用户名
     *
     * @return 用户名
     */
    public static String getUsername() {
        return getUser().map(LoginUser::getUsername)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取姓名
     *
     * @return 姓名
     */
    public static String getFullName() {
        return getUser().map(LoginUser::getFullName)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取请求者IP
     *
     * @return 请求者IP
     */
    public static String getRequestIp() {
        return getUser().map(LoginUser::getRequestIp)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取请求路径
     *
     * @return 请求路径
     */
    public static String getRequestPath() {
        return getUser().map(LoginUser::getRequestPath)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取请求类型
     *
     * @return 请求类型
     */
    public static String getRequestType() {
        return getUser().map(LoginUser::getRequestType)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取token过期时间
     *
     * @return token过期时间
     */
    public static LocalDateTime getTokenExpireTime() {
        return getUser().map(LoginUser::getTokenExpireTime)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * 获取权限集合(Set)
     *
     * @return 权限集合(Set)
     */
    public static Set<String> getPermitSet() {
        return getUser().map(LoginUser::getPermitSet)
                .orElseThrow(() -> new CustomException("无效的用户信息"));
    }

    /**
     * token里用户信息封装类,根据需要增减字段和处理字段值
     * 尽量不要设置电话邮箱姓名等信息,总之敏感重要的信息就不要放在里面,
     * 不需要的信息也不要放在里面
     *
     * @author yangbiao
     * @date 2020/11/5
     */
    /**
     * @author yangbiao
     * @date 2022/2/25
     */
    @Data
    public static class LoginUser {
        /**
         * 用户ID
         */
        private String userId;
        /**
         * 姓名
         */
        private String fullName;
        /**
         * 用户名
         */
        private String username;
        /**
         * 请求者IP
         */
        private String requestIp;
        /**
         * 请求路径
         */
        private String requestPath;
        /**
         * 请求类型(GET|POST)
         */
        private String requestType;
        /**
         * 用户机构
         */
        private String userOrganization;
        /**
         * 请求部门
         */
        private String userDepartment;
        /**
         * 请求职位
         */
        private String userPosition;
        /**
         * 请求角色
         */
        private String userRole;
        /**
         * token到期时间(用于业务判断token是否到期,因为解析token很麻烦)
         */
        private LocalDateTime tokenExpireTime;
        /**
         * 权限集合
         */
        private Set<String> permitSet;

    }

}
